package com.zhentao.service;

import com.zhentao.face.WebFaceCompare;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 人脸比对服务类
 * 封装人脸比对功能，提供统一的接口
 */
@Service
public class FaceCompareService {

    private static final Logger logger = LoggerFactory.getLogger(FaceCompareService.class);

    /**
     * 比对两张人脸图片
     * @param image1Path 第一张图片路径
     * @param image2Path 第二张图片路径
     * @return 比对结果，包含相似度分数
     */
    public Map<String, Object> compareFaces(String image1Path, String image2Path) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            logger.info("开始人脸比对，图片1: {}, 图片2: {}", image1Path, image2Path);
            
            // 创建人脸比对实例
            WebFaceCompare webFaceCompare = new WebFaceCompare();
            
            // 调用比对接口
            Map<String, Object> compareResult = webFaceCompare.compareFaces(image1Path, image2Path);
            
            if (compareResult == null) {
                logger.error("人脸比对返回结果为空");
                result.put("success", false);
                result.put("message", "人脸比对失败");
                result.put("score", 0.0);
                return result;
            }
            
            // 检查返回码
            Integer code = (Integer) compareResult.get("code");
            if (code == null || code != 200) {
                String message = (String) compareResult.get("message");
                logger.error("人脸比对失败，错误码: {}, 错误信息: {}", code, message);
                result.put("success", false);
                result.put("message", message != null ? message : "人脸比对失败");
                result.put("score", 0.0);
                return result;
            }
            
            // 获取相似度分数
            Object scoreObj = compareResult.get("score");
            double score = 0.0;
            
            if (scoreObj instanceof Number) {
                score = ((Number) scoreObj).doubleValue();
            } else if (scoreObj instanceof String) {
                try {
                    score = Double.parseDouble((String) scoreObj);
                } catch (NumberFormatException e) {
                    logger.error("相似度分数格式错误: {}", scoreObj);
                }
            }
            
            // 构建返回结果
            result.put("success", true);
            result.put("message", "人脸比对成功");
            result.put("score", score);
            result.put("isSamePerson", score >= 0.9); // 使用0.9作为阈值
            
            logger.info("人脸比对完成，相似度: {}, 是否同一人: {}", score, score >= 0.9);
            
        } catch (Exception e) {
            logger.error("人脸比对异常", e);
            result.put("success", false);
            result.put("message", "人脸比对异常: " + e.getMessage());
            result.put("score", 0.0);
        }
        
        return result;
    }
    
    /**
     * 验证人脸图片是否有效
     * @param imagePath 图片路径
     * @return 是否有效
     */
    public boolean validateFaceImage(String imagePath) {
        try {
            // 这里可以添加图片格式、大小等验证逻辑
            if (imagePath == null || imagePath.trim().isEmpty()) {
                return false;
            }
            
            // 检查是否是支持的图片格式
            String lowerPath = imagePath.toLowerCase();
            return lowerPath.endsWith(".jpg") || 
                   lowerPath.endsWith(".jpeg") || 
                   lowerPath.endsWith(".png") || 
                   lowerPath.endsWith(".bmp");
                   
        } catch (Exception e) {
            logger.error("验证人脸图片失败", e);
            return false;
        }
    }
    
    /**
     * 获取推荐的相似度阈值
     * @return 阈值
     */
    public double getRecommendedThreshold() {
        return 0.9;
    }
}
